<?php
/*
 Security functions for image upload, secure sessions, input and database filter
 
 Michael Schwarz - 03.12.2010
*/


// --- DATABASE ---

/**
 \brief MySQL - String filtern
 
 Filter aus einem String alle gefaehrlichen Zeichen, sodass dieser danach in ein MySQL Datenbank gespeichert werden kann
 
 \param $s zu filternder String
 \return gefilterter String
*/
function secure_mysql_string($str) {
 if($str === NULL) return "NULL";
 return mysql_real_escape_string($str);
}

/**
 \brief MySQL - Integer filtern
 
 Wandelt einen String in eine Zahl um und verwirft ungueltige Strings.
 
 \param $i Integer-String
 \return Integer
*/
function secure_mysql_int($val) {
 if($val === NULL) return 0;
 return intval($val);
}



// --- User Input ---
/**
 \brief Eingabe - String filtern
 
 Filtert einen vom User eingegebenen String. Standardmäßig wird HTML maskiert.
 Sollen die HTML Tags in ihrer Funktion erhalten bleiben, muss als zweiter Parameter
 1 übergeben werden.
 
 \param $str String
 \param $allowhtml HTML erlauben (default: 0)
 \return gefilterter String
*/
function secure_user_input_string($str, $allowhtml = 0) {
 $ret = stripslashes($str);
 // filter html
 if(!$allowhtml) {
  $ret = str_replace("&amp;", "&", $ret);
  $ret = str_replace("&", "&amp;", $ret);
  $ret = str_replace("<", "&lt;", $ret);
  $ret = str_replace(">", "&gt;", $ret);
 }
 return $ret;
}

/**
 \brief Eingabe - Zahl filtern
 
 Wandelt eine Usereingabe in eine Zahl um. Liefert 0 wenn der String keine gueltige Zahl ist.
 
 \param $val Integer-String
 \return Integer
*/
function secure_user_input_int($val) {
 return intval($val);
}

/**
 \brief Eingabe - alphanumerische Zeichen und Unterstrich
 
 Filtert alles bis auf Buchstaben, Zahlen und Unterstriche aus dem String.
 
 \param $str String
 \return gefilterter String
*/
function secure_alphanum($str) {
 $nstr = "";
 for($i = 0; $i < strlen($str); $i++) {
  if(($str[$i] >= 'a' && $str[$i] <= 'z') || ($str[$i] >= 'A' && $str[$i] <= 'Z') || ($str[$i] >= '0' && $str[$i] <= '9') || $str[$i] == '_') $nstr .= $str[$i];
 }
 return $nstr;
}


// --- Sessions ---
/**
 \brief Session - Generiert eine eindeutige ID
 
 Die Funktion generiert eine mit sehr großer Wahrscheinlichkeit eindeutige ID, 
 indem sie den Hash von IP Adresse, User Agent und Accepted Encodings generiert.
 Kann verwendet werden um Session Hijacking zu verhindern.
 
 \return Unique ID
*/
function secure_get_unique_id() {
 return sha1("absvlfs_".$_SERVER["REMOTE_ADDR"]."$".$_SERVER["HTTP_USER_AGENT"]."#".$_SERVER["HTTP_ACCEPT_ENCODING"]);
}



// --- Picture Upload ---
/**
 \brief Upload - ueberprueft ob eine Datei eine gueltige Bilddatei ist.
 
 Ueberprueft, ob eine Datei eine gueltige Bilddatei ist, und konvertiert diese wenn
 gewuenscht in eine png Datei.
 
 \param $file Dateiname
 \param $strict Auch mit Hilfe der GD Lib ueberpruefen (Bild wird dekodiert) (default: 1)
 \param $new_file Dateiname der neuen Datei, wenn das Bild konvertiert werden soll, sonst NULL (defualt: NULL)
*/
function secure_picture($file, $strict = 1, $new_file = null) {
 $acc = Array(".jpg", ".jpeg", ".gif", ".png");
 $ok = 0;
 $type = "";
 
 for($i = 0; $i < count($acc); $i++) {
  if(strtolower(substr($file, strlen($file) - strlen($acc[$i]), strlen($acc[$i]))) == $acc[$i]) {
   $ok = 1;
   $type = substr($acc[$i], 1);
   break;
  }
 }
 
 // wrong extension
 if(!$ok) return -1;
 
 // not a valid image, if we have no image information
 $info = null;
 if(($info = getimagesize($file)) == false) return -2;
 
 // not a valid image, if width and height are 0
 if($info[0] == 0 || $info[1] == 0) return -2;
 
 if($strict) {
  switch($type) {
   case "png":
    $im = @imagecreatefrompng($file); break;
   case "jpg":
   case "jpeg":
    $im = @imagecreatefromjpeg($file); break;
   case "gif":
    $im = @imagecreatefromgif($file); break;
   default:
    $im = null;
  }

  // not a valid picture
  if(!$im) return -3;

  // create new picture (removes all injected code, if any)
  if($new_file != null) imagepng($im, $new_file); 

  imagedestroy($im);
 }

 return 1;
}

?>
